package dac.dao;

import com.mysql.jdbc.StringUtils;
import static com.sun.org.apache.xalan.internal.lib.ExsltDatetime.date;
import dac.model.Usuario;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Time;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.http.HttpSession;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;

public class PedidoDAO {
    private Connection con;
    private HttpSession session;
    
    public PedidoDAO (Connection con) {
        this.con = con;
    }
    
    public PedidoDAO () {
    }
    
    public void setSession(HttpSession session){
        this.session = session;
    }
    
    
    public String listarUmJSON(String pedido_id) throws SQLException{
        String query = "SELECT * FROM item WHERE pedido_id="+pedido_id;
        
        PreparedStatement st = con.prepareStatement(query);
        ResultSet rs = st.executeQuery();
        
        JSONArray jsonArray = new JSONArray();
        
        while (rs.next()) {
            JSONObject jsonObject = new JSONObject();
            
//            jsonObject.put("nome", Integer.parseInt(rs.getString("nome")) );
            jsonObject.put("nome", rs.getString("nome") );
            jsonObject.put("preco_unitario", rs.getString("preco_unitario") );
            jsonObject.put("preco_total_item", rs.getString("preco_total_item") );
            jsonObject.put("quantidade", rs.getString("quantidade") );
            
            jsonArray.add(jsonObject);
        }
        
        if ( jsonArray.isEmpty() ){
            return "false";
        }
        return jsonArray.toString();
    }
    
    
    public String removerPedido(String id) throws SQLException{
        PreparedStatement st = con.prepareStatement("UPDATE pedido SET status_pedido=2 WHERE id="+id);
        int rs = st.executeUpdate();
        
        if (rs==1) {
            return "true"; // Removido
        }
        
        return "false"; // Erro
    }
    
    
    
    public String listarJSON() throws SQLException, ParseException {
        String query = "SELECT p.id AS numpedido, " +
                        "    u.nome AS cliente, " +
                        "    p.data_criado AS data_cadastro, " +
                        "    p.total_itens AS total_itens, " +
                        "    p.valor_total AS valor_total, " +
                        "    p.tempo_preparo AS tempo_preparo " +
//                        "    p.status AS status " +
                        "FROM pedido p " +
                        "JOIN usuario u ON u.id = p.usuario_id " + 
                        "WHERE p.status_pedido=1 " + 
                        "ORDER BY p.id ASC";
        
        PreparedStatement st = con.prepareStatement(query);
        ResultSet rs = st.executeQuery();
        
        JSONArray jsonArray = new JSONArray();
        
        while (rs.next()) {
            JSONObject jsonObject = new JSONObject();
            
            long tm=0;
            String tempo = rs.getString("tempo_preparo");
            String[] arr = tempo.split(":");
            tm += Integer.parseInt(arr[2]);
            tm += 60 * Integer.parseInt(arr[1]);
            tm += 3600 * Integer.parseInt(arr[0]);    
            
            String[] arr1 = rs.getString("data_cadastro").split(" ");
            String entregaHora = arr1[1];            
            String[] arr2 = entregaHora.split(":");                        
            arr2[2] = arr2[2].substring(0, arr2[2].length()-2);            
            tm += Integer.parseInt(arr2[2]);
            tm += 60 * Integer.parseInt(arr2[1]);
            tm += 3600 * Integer.parseInt(arr2[0]);

            long hh = tm / 3600;
            tm %= 3600;
            long mm = tm / 60;
            tm %= 60;
            long ss = tm;
            String dataEntre = format(hh) + ":" + format(mm) + ":" + format(ss);
            dataEntre = arr1[0]+" "+dataEntre;
            
            Date dataEntrega = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(dataEntre);
            String newDataEntrega = new SimpleDateFormat("dd/MM/yy HH:mm:ss").format(dataEntrega);
            
            Date dataCadastro = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(rs.getString("data_cadastro"));
            String newDataCadastro = new SimpleDateFormat("dd/MM/yy HH:mm:ss").format(dataCadastro);
//            

           
            
            jsonObject.put("numpedido", Integer.parseInt(rs.getString("numpedido")) );
            jsonObject.put("cliente", rs.getString("cliente") );
            jsonObject.put("data_cadastro", newDataCadastro );
            jsonObject.put("data_entrega", newDataEntrega );
            jsonObject.put("tempo_preparo", rs.getString("tempo_preparo") );
            jsonObject.put("valor_total", rs.getString("valor_total") );
            jsonObject.put("total_itens", rs.getString("total_itens") );
            
            jsonArray.add(jsonObject);
        }
        
        if ( jsonArray.isEmpty() ){
            return "false";
        }
        return jsonArray.toString();
        
    }
    
    
    private static String format(long s){
        if (s < 10) return "0" + s;
        else return "" + s;
    }
    
    
    public String novoPedido(String produtoList, String valorTotal) throws SQLException {

        Usuario u = (Usuario) session.getAttribute("u");
                
        // Variaveis para a tebela pedido
        int totalItens=0;
        String queryItem="";
        String[] itens = produtoList.split(";");   
        long tm = 0;
        for (int i = 0; i < itens.length; i++) {
            String[] temp = itens[i].split(",");
            String produtoID = temp[0];
            int quantidade = Integer.parseInt(temp[1]);
            totalItens += quantidade;
            
            
            // Consulta nome, preco unitario
            PreparedStatement st = con.prepareStatement("SELECT * FROM produto WHERE id="+produtoID);
            ResultSet rs = st.executeQuery();
            rs.next(); 
            
            String tempo = rs.getString("tempo_preparo");
            String[] arr = tempo.split(":");
            tm += Integer.parseInt(arr[2]);
            tm += 60 * Integer.parseInt(arr[1]);
            tm += 3600 * Integer.parseInt(arr[0]);
            
            Double precoTotalItem = quantidade*Double.parseDouble(rs.getString("preco"));
            
            queryItem += "('PEDIDO_ID', '"+produtoID+"', '"+rs.getString("nome")+"', '"+rs.getString("preco")+"', '"+quantidade+"', '"+precoTotalItem+"'),";

        } //end for
        
        long hh = tm / 3600;
        tm %= 3600;
        long mm = tm / 60;
        tm %= 60;
        long ss = tm;
        String tempoPreparo = format(hh) + ":" + format(mm) + ":" + format(ss);
        
        // Cria o PEDIDO
        String queryPedido = "INSERT INTO pedido (usuario_id, total_itens, valor_total, status_pedido,tempo_preparo) "+
                             "VALUES ('"+u.getId()+"', '"+totalItens+"', '"+valorTotal+"', 1, '"+tempoPreparo+"')";
        PreparedStatement st = con.prepareStatement(queryPedido, Statement.RETURN_GENERATED_KEYS);
        int rs = st.executeUpdate();
        ResultSet key = st.getGeneratedKeys();    
                  key.next();
        int pedidoID = key.getInt(1);
        //---
        
        // Insere os ITENS do PEDIDO        
        queryItem = queryItem.replace("PEDIDO_ID", pedidoID+"");
        queryItem = queryItem.substring(0, queryItem.length()-1);
        
        queryItem = "INSERT INTO item (pedido_id, produto_id, nome, preco_unitario, quantidade, preco_total_item) VALUES "+queryItem+";";
   
        PreparedStatement st2 = con.prepareStatement(queryItem);
        int rs2 = st2.executeUpdate();
        
        if (rs==1) {
            return "true";
        }
        
        return "false";
    }
}
